package com.sky.controller.user;

import cn.hutool.core.bean.BeanUtil;
import com.sky.entity.Dish;
import com.sky.entity.Setmeal;
import com.sky.entity.SetmealDish;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.service.SetmealDishService;
import com.sky.service.SetmealService;
import com.sky.vo.DishItemVO;
import com.sky.vo.SetmealVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.stream.Collectors;

@RestController("userSetmealController")
@RequestMapping("/user/setmeal")
@Api(tags = "C端-套餐浏览接口")
public class SetmealController {
    @Autowired
    SetmealService setmealService;
    @Autowired
    SetmealDishService setmealDishService;
    @Autowired
    DishService dishService;

    /**
     * 根据类别ID列出套餐
     *
     * 此方法通过调用setmealService查询符合特定类别ID和状态为1（通常表示启用或有效）的所有套餐
     * 如果提供了类别ID，则使用该ID进行查询，否则不考虑类别ID，只根据状态进行查询
     * 查询到的套餐信息将转换为SetmealVO对象，并且每个套餐相关的菜品信息也将被查询并关联到对应的SetmealVO对象上
     *
     * @param categoryId 类别ID，用于筛选套餐如果为null，则不根据类别筛选
     * @return 包含套餐信息的Result对象如果查询成功，将返回状态码和套餐信息列表
     */
    @GetMapping("/list")
    @ApiOperation("根据分类id查询套餐")
    @Cacheable(cacheNames = "setmealCache", key = "#categoryId")
    public Result listByCategory(Long categoryId) {
        // 查询符合条件的套餐列表
        List<Setmeal> setmeals = setmealService.query()
                .eq(categoryId != null, "category_id", categoryId)
                .eq("status", 1)
                .list();

        // 将查询到的套餐列表转换为SetmealVO列表，并为每个套餐VO设置相关的菜品信息
        List<SetmealVO> setmealVOS = setmeals.stream().map(setmeal -> {
            // 将Setmeal对象转换为SetmealVO对象
            SetmealVO setmealVO = BeanUtil.toBean(setmeal, SetmealVO.class);
            // 查询与当前套餐相关的所有菜品
            List<SetmealDish> setmealDishes = setmealDishService.query().eq("setmeal_id", setmeal.getId()).list();
            // 将菜品信息设置到套餐VO中
            setmealVO.setSetmealDishes(setmealDishes);
            return setmealVO;
        }).collect(Collectors.toList());

        // 返回包含套餐VO列表的成功结果
        return Result.success(setmealVOS);
    }

    /**
     * 根据菜品ID获取菜品详细信息
     * 此方法首先根据提供的菜品ID查询关联的套餐菜品信息，
     * 然后遍历每个套餐菜品，将其转换为菜品详情视图对象（DishItemVO），
     * 并通过菜品ID获取对应的菜品详细信息，最终返回包含所有菜品详情的列表
     *
     * @param id 菜品ID，用于查询菜品详细信息
     * @return Result<List<DishItemVO>> 返回一个Result对象，包含菜品详情视图对象列表
     */
    @ApiOperation("根据套餐id查询套餐详情")
    @GetMapping("/dish/{id}")
    public Result<List<DishItemVO>> getDishDetailById(@PathVariable Long id) {
        // 查询与给定套餐ID关联的所有套餐菜品信息
        List<SetmealDish> setmealDishes = setmealDishService.query().eq("setmeal_id", id).list();

        // 将套餐菜品信息转换为菜品详情视图对象列表
        List<DishItemVO> dishItemVOS = setmealDishes.stream().map(setmealDish -> {
            // 将套餐菜品对象转换为菜品详情视图对象
            DishItemVO dishItemVO = BeanUtil.toBean(setmealDish, DishItemVO.class);

            // 根据套餐菜品中的菜品ID获取对应的菜品详细信息
            Dish dish = dishService.getById(setmealDish.getDishId());

            // 将菜品详细信息复制到菜品详情视图对象中
            BeanUtil.copyProperties(dish, dishItemVO);

            // 返回转换后的菜品详情视图对象
            return dishItemVO;
        }).collect(Collectors.toList());

        // 返回包含所有菜品详情视图对象的列表
        return Result.success(dishItemVOS);
    }
}
